
import {defineStore} from 'pinia'
import http from '@/utils/http'
import {constantRoute,asnycRoute,anyRoute} from '@/router/routers'
import {reqUserInfo,reqLogout} from '@/api/user'
import router from '@/router'
import {extend} from '@/utils/tools'
import cloneDeep from 'lodash/cloneDeep'
import { ElMessage } from 'element-plus'


// defineStore用来创建小仓库，参数1是仓库名，参数2是一个对象
let useUserStore = defineStore('User',{
    state:()=>{
        return {
            // token:JSON.parse(localStorage.getItem('token')),
            userInfo:JSON.parse(localStorage.getItem('userInfo')),
            username:localStorage.getItem('username'),
            avatar:localStorage.getItem('avatar'),
            userRouters:JSON.parse(localStorage.getItem('userRouters')),  // 获取用户的路由
            userButtons:JSON.parse(localStorage.getItem('userButtons')),  // 获取用户的按钮
            // menuRoutes: JSON.parse(localStorage.getItem('menuRoutes')) || constantRoute,  // 获取路由菜单，如果localStorage中已经有了则获取，如果没有则获取默认菜单constantRoute
            menuRoutes: constantRoute,  // 获取路由菜单，如果localStorage中已经有了则获取，如果没有则获取默认菜单constantRoute
            routersArr: [],  // 测试
        }
    },
    actions:{
        // 获取csrftoken,django发送post请求时需要csrf认证。这里已经没用了，直接在 src\utils\http.js 文件的拦截器中重写了
        get_csrftoken(){
            return
            http({
                url:'get_csrftoken/',
                method:'get'
            }).then(res=>{
            })
            
            let cookie_list = document.cookie.split(';')
            let csrf_token = ''
            cookie_list.forEach((item,index)=>{
                if(item.split('=')[0].trim()=="csrftoken"){
                    csrf_token = item.split('=')[1]
                }
            })
            return csrf_token
        },
        // 用户登录方法
        async userLogin(loginForm){
            // let csrf_token = await this.get_csrftoken()
            // var xmlhttp = new XMLHttpRequest()  // 创建XMLHttpRequest对象
            // xmlhttp.withCredentials=true;
            // xmlhttp.onreadystatechange = function(){  // 请求状态发生改变时，绑定事件
            //     if(xmlhttp.readyState==4 && xmlhttp.status==200){  // 请求发送完成，并成功返回状态码为200时执行的事件
                    
            //         console.log('请求成功');
            //     }
            // }
            // xmlhttp.open('post','http://192.168.0.86:2233/api/login/',true)  // 发送get请求，参数1请求方式，参数2是请求地址，参数3是是否异步，true为异步false为同步
            // xmlhttp.setRequestHeader('Content-type','application/json')
            // xmlhttp.setRequestHeader('X-CSRFToken',csrf_token)
            // let data = {
            //     username:loginForm.username,
            //     password:loginForm.password
            // }
            // xmlhttp.send(JSON.stringify(data))

            

            // let csrf_token= await this.get_csrftoken()
            await http({
                url:'/login/',
                method:'post',
                data:{
                    username:loginForm.username,
                    password:loginForm.password
                },
                // headers:{
                //     'X-CSRFToken':csrf_token
                // }
            }).then(res=>{
                if(res.data.code==200){
                    // 保存登录信息
                    this.userInfo = res.data.data
                    this.username = res.data.data.username
                    this.avatar = res.data.data.avatar
                    localStorage.setItem('userInfo',JSON.stringify(res.data.data))
                    localStorage.setItem('username',res.data.data.username)
                    localStorage.setItem('avatar',res.data.data.avatar)
                    
                    // this.userInfo()
                    // 获取用户能访问的路由和功能
                    let userRouters = []
                    // let userRouters = ['Acl','User','Role','Permission','Product','Trademark','Attr','Spu','Sku']
                    res.data.data.routers.forEach(item=>{
                        if(item.code){
                            userRouters.push(item.code)
                        }
                    })
                    localStorage.setItem('userRouters',JSON.stringify(userRouters))  // 保存用户路由权限
                    this.userRouters = userRouters  // 保存一份
                    this.addUserRote(userRouters)

                    // 获取用户能使用的按钮
                    let userButtons = []
                    res.data.data.buttons.forEach(item=>{
                        if(item.code){
                            userButtons.push(item.code)
                        }
                    })
                    localStorage.setItem('userButtons',JSON.stringify(userButtons))  // 保存用户能使用的按钮
                    this.userButtons = userButtons  // 在仓库里保存一份

                    
                    return 'ok'
                }else{
                    return Promise.reject(new Error(res.data.msg))
                }
            })
        },
        // 获取用户信息方法
        async getUserInfo(){
            let result = await reqUserInfo()
            if(result.data.code==200){
                this.username=result.data.data.username
                this.avatar = result.data.data.avatar
                console.log('获取用户信息',result.data);
                return 'ok'
            }else{
                return Promise.reject('获取用户信息失败')
            }

        },
        // 用户登出
        async userLogout(){
            let result = await reqLogout()
            // 删除路由信息
            this.userRouters.forEach(item=>{
                // 退出登录时，清除异步路由
                if(router.hasRoute(item)){
                    router.removeRoute(item)
                }
            })

            this.userInfo=''
            this.username=''
            this.avatar=''
            localStorage.removeItem('userInfo')
            localStorage.removeItem('username')
            localStorage.removeItem('avatar')
            localStorage.removeItem('userRouters')
            // localStorage.removeItem('menuRoutes')
            
            // window.location.reload()
            if(result.data.code==200){
                
                // return 'ok'
            }else{
                ElMessage({
                    type:'error',
                    message:res.data.msg
                })
            }
            
        },
        // 获取用户有权限的菜单和按钮
        filterAsyncRoute(asnycRoute,userRouters,routersArr=[]){
            // return asnycRoute.filter(item=>{
            //     if(userRouters.includes(item.name)){
            //         if(item.children && item.children.length>0){
            //             item.children = this.filterAsyncRoute(item.children,userRouters)
            //         }
            //         return true
            //     }
            // })

            for(let item of asnycRoute){
                if(item.children && item.children.length>0){
                    let ret = this.filterAsyncRoute(item.children,userRouters,[])
                    if(ret){
                        item.children = ret
                        routersArr.push(item)
                    }
                }else{
                    if(userRouters.includes(item.name)){
                        routersArr.push(item)
                    }
                }


            }
            return routersArr
        },
        // 把用户有权访问的路由添加进本地路由
        addUserRote(userRouters){
            
            let userAsyncRoute = this.filterAsyncRoute(cloneDeep(asnycRoute),userRouters)
            this.menuRoutes = constantRoute.concat(userAsyncRoute)
            
            userAsyncRoute.forEach(item=>{
                router.addRoute(item)  // 注册路由
            })

        }
    },
    getters:{

    }
})

export default useUserStore